package com.taotao.sso.service.impl;

import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import com.taotao.common.TaotaoResult;
import com.taotao.mapper.TbUserMapper;
import com.taotao.pojo.TbUser;
import com.taotao.pojo.TbUserExample;
import com.taotao.pojo.TbUserExample.Criteria;
import com.taotao.sso.service.UserRegisterService;
/**
 * 检查数据是否可用的 服务层接口实现类
 * @author created by wq
 * @date   Sep 5, 2017---3:42:17 PM
 * @return
 * @throws Exception<br/>
 *==========History========== <br/>
 * taotao-sso-service Sep 5, 2017
 */
@Service
public class UserRegisterServiceImpl implements UserRegisterService{


	@Autowired
	private TbUserMapper userMapper;
	
	@Override
	public TaotaoResult checkUserInfo(String param, int type) {
		/**
		 * 根据接口文档，我们需要判定数据是否可用，
		 * 	param对应的有三个值：username/phone/email --->对应的type：1/2/3
		 */
		//调用业务层
		TbUserExample example = new TbUserExample();
		Criteria criteria = example.createCriteria();
		if(type == 1){
			criteria.andUsernameEqualTo(param);
		}else if(type == 2){
			criteria.andPhoneEqualTo(param);
		}else if(type == 3){
			criteria.andEmailEqualTo(param);
		}else{
			return TaotaoResult.build(400, "参数不可用或是非法参数");
		}
		List<TbUser> list = userMapper.selectByExample(example);
		if(list == null || list.size() == 0){
			return TaotaoResult.ok(true);
		}
		
		return TaotaoResult.ok(false);
	}

	/**
	 * 对照接口文档实现 新用户的注册功能， 
	 * 而根据tb_user分析：
	 * 			1.先过滤掉数据库强制说明 不可为空的： username、password
	 * 			2.在校验数据的可用性  : 通过上面的校验username/phone/email方法来得到每个返回的TaoTaoResult
	 * 			 (1). username
	 * 				通过TaoTaoResult中的Data属性，传递到页面的是true或false。 利用这个来作为校验时的条件
	 * 				直接用false来过滤掉 不可用的 username，
	 * 			 
	 * 			 (2). phone
	 * 				因为phone在数据库中是可以为空的，所以我们在校验之前需要先将为null的排除掉
	 * 				然后再像判断username一样过滤掉手机号已占用问题。
	 * 			 (3). email
	 *				 因为email在数据库中是可以为空的，所以我们在校验之前需要先将为null的排除掉
	 *				然后再像判断username一样过滤掉手机号已占用问题。
	 * 				
	 * 			以上的条件都能通过，说明用户注册时输入的参数都是合格的。这时我们需要补全user属性，然后存在数据库中。
	 * 		  	完成用户注册
	 *			3.之后我们需要补充user对象中的属性 
	 * 			4.然后返回TaoTaoResult
	 */
	@Override
	public TaotaoResult userRegister(TbUser user) {
		//使用user接收提交的请求
		//1.先拦截用户名为空
		if(StringUtils.isBlank(user.getUsername())){
			return TaotaoResult.build(400, "用户名不可为空");
		}
		//2.再拦截密码为空
		if(StringUtils.isBlank(user.getPassword())){
			return TaotaoResult.build(400, "密码不可为空");
		}
		//3.直接调用上面的校验数据:username
		TaotaoResult result = checkUserInfo(user.getUsername(),1);
		if(!(boolean) result.getData()){
			return TaotaoResult.build(400, "此用户名已被占用");
		}
		
		//4.phone
		if(StringUtils.isNoneBlank(user.getPhone())){
			TaotaoResult result2 = checkUserInfo(user.getPhone(),2);
			if(!(boolean) result2.getData()){
				return TaotaoResult.build(400, "此手机号已被占用");
			}
		}
		//5.email
		if(StringUtils.isNoneBlank(user.getEmail())){
			TaotaoResult result2 = checkUserInfo(user.getEmail(),3);
			if(!(boolean) result2.getData()){
				return TaotaoResult.build(400, "此邮箱已被占用");
			}
		}
		//6.补全user的属性
		user.setCreated(new Date());
		user.setUpdated(new Date());
		
		//7.密码采用md5加密
		String md5Pwd = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
		user.setPassword(md5Pwd);
		//8.存入到数据库中
		userMapper.insert(user);
		
		return TaotaoResult.ok();
	}

}
